#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main()
{
//    const char *str1 = "hello printf\n";
//    const char *str2 = "hello fprintf\n";  
//    const char *str3 = "hello fputs\n";  
//    const char *str4 = "hello write\n";  
//
//    // C库函数
//    printf(str1);
//    fprintf(stdout, str2);
//    fputs(str3, stdout);
//
//    // 系统接口
//    write(1, str4, strlen(str4));
//
//    // 调用完了上面的代码，再执行fork
//    fork();




//    // printf没有立即刷新的原因，是因为有缓冲区的存在
//    printf(" hello printf"); // stdout -> 封装了wirte 
//    fprintf(stdout, " hello fprintf");
//    fputs(" hello fputs", stdout);

//    // write会立即刷新
//    // 缓冲区一定不在write内部
//    // 说明缓冲区不是内核级别的
//    // 缓冲区只能是由语言提供的，是语言级别的
//    const char *msg = "hello write";
//    write(1, msg, strlen(msg));

//    //close(1);

//    sleep(5);

//    close(stdout->_fileno);

//    int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//    int fd = open("log.txt", O_WRONLY | O_CREAT | O_APPEND, 0666);
    int fd = open("log.txt", O_RDONLY);

    if(fd < 0)
    {
        perror("open");
        return 0;
    }

    dup2(fd, 0);

    char line[64];
    while(fgets(line, sizeof line,stdin) != NULL)
    {
        printf("%s", line);
    }

    fprintf(stdout, "打开文件成功, fd: %d\n", fd);

    fflush(stdout);

    close(fd);
}
